home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 October: Mac OS SDK / Dev.CD Oct 97 SDK1.toast / Development Kits (Disc 1) / QuickDraw 3D / Samples / SampleCode / ScreenSaver / Twist 1.0.sit / Twist 1.0 / ADTwist.c / ADTwist.c
Encoding:
C/C++ Source or Header  |  1996-08-17  |  7.6 KB  |  357 lines  |  [TEXT/CWIE]

  1. /* ADTwist.c
  2.  * After Dark module that "twists" the screen pixels
  3.  * Copyright ©1996 Michael D. Crawford.  All Rights Reserved.
  4.  * You may use this code on the condition that you read the following web page:
  5.  * http://www.scruznet.com/~crawford/WordServices/wdsvindex.html
  6.  */
  7.  
  8. #include <QDOffscreen.h>
  9. #include "GraphicsModule_Types.h"
  10. #include "MessageHandlers.h"
  11. #include "GoToWebPage.h"
  12.  
  13. #define kMaxScreens    8
  14.  
  15. enum{
  16.     kGoToWebPageMsg = 8,
  17.     kGetSourceCodeMsg = 9
  18. };
  19.  
  20. enum{
  21.     kGoToWebPageStr = 129,
  22.     kGetSourceCodeStr = 130
  23.  
  24. };
  25.  
  26. typedef struct{
  27.     short        curLine;
  28.     GWorldPtr    tempWorld;
  29.     GWorldPtr    oldScreen;
  30. }tScreenInfo, *tScreenInfoPtr, **tScreenInfoHdl;
  31.  
  32. typedef struct{
  33. //    short         curLine;
  34.     Boolean        firstDraw;
  35.     short        curMonitor;
  36. //    GWorldPtr    tempWorld;
  37. //    GWorldPtr    oldScreen;
  38.     tScreenInfoHdl    screenInfo[ kMaxScreens ];
  39. } tTwistInfo, *tTwistPtr, **tTwistHandle;
  40.  
  41. void CenterRect( Rect *toPtr, Rect *fromPtr, Rect *inPtr );
  42.  
  43. OSErr DoInitialize(Handle *storage, RgnHandle blankRgn, GMParamBlockPtr params)
  44. {
  45.     tTwistHandle    tHdl;
  46.     Rect            r;
  47.     GWorldPtr        tempWorld;
  48.     GWorldPtr        oldScreen;
  49.     GWorldPtr        curWorld;
  50.     GDHandle        curDev;
  51.     OSErr            err;
  52.     short            i;
  53.     
  54.     tHdl = (tTwistHandle)NewHandle( sizeof( tTwistInfo ) );
  55.     if ( !tHdl )
  56.         return MemError();
  57.         
  58.     *storage = (Handle)tHdl;
  59.     
  60.     (*tHdl)->firstDraw = true;
  61.  
  62.     GetGWorld( &curWorld, &curDev );
  63.         
  64.     for ( i = 0; i < params->monitors->monitorCount ; i++){
  65.         (*tHdl)->screenInfo[ i ] = (tScreenInfoHdl)NewHandle( sizeof( tScreenInfo ) );
  66.         if ( !(*tHdl)->screenInfo[ i ] )
  67.             return memFullErr;
  68.         
  69.         r = params->monitors->monitorList[ i ].bounds;
  70.     
  71.         err = NewGWorld( &oldScreen,
  72.                         params->monitors->monitorList[ i ].curDepth, 
  73.                         &r,
  74.                         (CTabHandle)NULL,
  75.                         (GDHandle)NULL,
  76.                         (GWorldFlags)0 );
  77.         
  78.         if ( err )
  79.             return err;
  80.             
  81.         (*(*tHdl)->screenInfo[ i ])->oldScreen = oldScreen;
  82.         
  83.         LockPixels( oldScreen->portPixMap );
  84.     
  85.         SetGWorld( oldScreen, curDev );
  86.     
  87.         CopyBits( ¶ms->qdGlobalsCopy->qdThePort->portBits,
  88.                     (BitMap*)*( oldScreen )->portPixMap,
  89.                     &r,
  90.                     &r, 
  91.                     srcCopy, 
  92.                     (RgnHandle)NULL );
  93.         
  94.         UnlockPixels( oldScreen->portPixMap );
  95.     
  96.         r.right = r.left + 1;
  97.     
  98.         (*(*tHdl)->screenInfo[ i ])->curLine = r.top;
  99.         
  100.         err = NewGWorld( &tempWorld,
  101.                         params->monitors->monitorList[ i ].curDepth, 
  102.                         &r,
  103.                         (CTabHandle)NULL,
  104.                         (GDHandle)NULL,
  105.                         (GWorldFlags)0 );
  106.         
  107.         if ( err )
  108.             return err;
  109.             
  110.         (*(*tHdl)->screenInfo[ i ])->tempWorld = tempWorld;
  111.         
  112.         LockPixels( tempWorld->portPixMap );
  113.         
  114.     }
  115.  
  116.     for ( ; i < kMaxScreens; i++ ){
  117.         (*tHdl)->screenInfo[ i ] = (tScreenInfoHdl)NULL;
  118.     
  119.     }
  120.  
  121.     SetGWorld( curWorld, curDev );
  122.  
  123.     return noErr;
  124. }
  125.  
  126. OSErr DoClose( Handle storage,RgnHandle blankRgn,GMParamBlockPtr params )
  127. {
  128.     tTwistHandle    tHdl;
  129.     short            i;
  130.  
  131.     tHdl = (tTwistHandle)storage;
  132.     
  133.     if ( !tHdl )
  134.         return noErr;
  135.     
  136.     for ( i = 0; i < kMaxScreens; i++ ){
  137.         if ( (*tHdl)->screenInfo[ i ] ){
  138.             if ( (*(*tHdl)->screenInfo[ i ])->tempWorld )
  139.                 DisposeGWorld( (*(*tHdl)->screenInfo[ i ])->tempWorld );
  140.             if ( (*(*tHdl)->screenInfo[ i ])->oldScreen )
  141.                 DisposeGWorld( (*(*tHdl)->screenInfo[ i ])->oldScreen );
  142.         }
  143.     }
  144.     
  145.     DisposeHandle( (Handle)tHdl );
  146.     
  147.     return noErr;
  148. }
  149.  
  150. OSErr DoBlank(Handle storage, RgnHandle blankRgn, GMParamBlockPtr params)
  151. {
  152.     PicHandle    pictH;
  153.     Rect    r;
  154.     Rect    screenRect;
  155.     Rect    toRect;
  156.     GWorldPtr    curWorld;
  157.     GWorldPtr    picWorld;
  158.     GDHandle    curDev;
  159.     OSErr        err;
  160.     long        newTime;
  161.     
  162.     FillRgn( blankRgn, ¶ms->qdGlobalsCopy->qdBlack );
  163.  
  164.     pictH = GetPicture( 1000 );
  165.     if ( !pictH )
  166.         return noErr;
  167.     
  168.     r = (*pictH)->picFrame;
  169.  
  170.     err = NewGWorld( &picWorld,
  171.                     1, 
  172.                     &r,
  173.                     (CTabHandle)NULL,
  174.                     (GDHandle)NULL,
  175.                     (GWorldFlags)0 );
  176.     
  177.     if ( err )
  178.         return err;
  179.             
  180.     LockPixels( picWorld->portPixMap );
  181.     
  182.     GetGWorld( &curWorld, &curDev );
  183.     SetGWorld( picWorld, curDev );
  184.     
  185.     DrawPicture( pictH, &r );
  186.     
  187.     InvertRect( &r );
  188.  
  189.     SetGWorld( (GWorldPtr)( params->qdGlobalsCopy->qdThePort ), curDev );
  190.  
  191.     screenRect = params->monitors->monitorList[ 0 ].bounds;
  192.     
  193.     CenterRect( &toRect, &r, &screenRect );
  194.  
  195.     CopyBits( (BitMap*)*( picWorld )->portPixMap,
  196.                 ¶ms->qdGlobalsCopy->qdThePort->portBits,
  197.                 &r, 
  198.                 &toRect,
  199.                 srcCopy, 
  200.                 (RgnHandle)NULL );
  201.  
  202.     ReleaseResource( (Handle)pictH );    
  203.     
  204.     Delay( 60, &newTime );
  205.  
  206.     return noErr;
  207. }
  208.  
  209. void CenterRect( Rect *toPtr, Rect *fromPtr, Rect *inPtr )
  210. {
  211.     short    inWidth;
  212.     short    inHeight;
  213.     
  214.     inWidth = inPtr->right - inPtr->left;
  215.     inHeight = inPtr->bottom - inPtr->top;
  216.     
  217.     toPtr->left = inPtr->left + ( inWidth / 2 ) 
  218.                                 - ( fromPtr->right - fromPtr->left ) / 2;
  219.     toPtr->top = inPtr->top + ( inHeight / 2 )
  220.                                 - ( fromPtr->bottom - fromPtr->top ) / 2;
  221.     
  222.     toPtr->right = toPtr->left + ( fromPtr->right - fromPtr->left );
  223.     toPtr->bottom = toPtr->top + ( fromPtr->bottom - fromPtr->top );
  224.  
  225.     return;
  226. }
  227.  
  228. OSErr DoDrawFrame(Handle storage,RgnHandle blankRgn,GMParamBlockPtr params)
  229. {
  230.     tTwistHandle    tHdl;
  231.     short            curLine;
  232.     GWorldPtr        tempWorld;
  233.     Rect            fromRect;
  234.     Rect            toRect;
  235.     Rect            scrollRect;
  236.     GDHandle        curDev;
  237.     GWorldPtr        curWorld;
  238.     short            i;
  239.     short            j;
  240.  
  241.     tHdl = (tTwistHandle)storage;
  242.  
  243.     GetGWorld( &curWorld, &curDev );
  244.  
  245.     if ( (*tHdl)->firstDraw ){
  246.         (*tHdl)->firstDraw = false;
  247.         
  248.         for ( i = 0; i < kMaxScreens; i++ ){
  249.             if ( (*tHdl)->screenInfo[ i ] ){
  250.                 fromRect = params->monitors->monitorList[ i ].bounds;
  251.         
  252.                 SetGWorld( (GWorldPtr)( params->qdGlobalsCopy->qdThePort ), curDev );
  253.  
  254.                 LockPixels( ((*(*tHdl)->screenInfo[ i ])->oldScreen)->portPixMap );
  255.             
  256.                 CopyBits( (BitMap*)*( (*(*tHdl)->screenInfo[ i ])->oldScreen)->portPixMap,
  257.                             ¶ms->qdGlobalsCopy->qdThePort->portBits,
  258.                             &fromRect, 
  259.                             &fromRect,
  260.                             srcCopy, 
  261.                             (RgnHandle)NULL );
  262.                 
  263.                 DisposeGWorld( (*(*tHdl)->screenInfo[ i ])->oldScreen );
  264.                 (*(*tHdl)->screenInfo[ i ])->oldScreen = (GWorldPtr)NULL;
  265.             }
  266.         }
  267.     }
  268.  
  269. #define kNumLoops    15
  270.  
  271.     for ( i = 0; i < kNumLoops; i++ ){
  272.     
  273.         for ( j = 0; j < params->monitors->monitorCount; j++ ){        
  274.             (*(*tHdl)->screenInfo[ j ])->curLine++;
  275.             if ( ( *(*tHdl)->screenInfo[ j ])->curLine 
  276.                     >= params->monitors->monitorList[ j ].bounds.bottom ){
  277.                 (*(*tHdl)->screenInfo[ j ])->curLine 
  278.                     = params->monitors->monitorList[ j ].bounds.top;
  279.             }
  280.         
  281.             curLine = (*(*tHdl)->screenInfo[ j ])->curLine;
  282.             
  283.             fromRect = params->monitors->monitorList[ j ].bounds;
  284.             toRect = fromRect;
  285.             scrollRect = fromRect;
  286.         
  287.             fromRect.left = fromRect.right - 1;
  288.             fromRect.bottom = curLine;
  289.             
  290.             toRect.right = toRect.left + 1;
  291.             toRect.bottom = curLine;
  292.             
  293.             scrollRect.bottom = curLine;
  294.         
  295.             
  296.             SetGWorld( (*(*tHdl)->screenInfo[ j ])->tempWorld, curDev );
  297.         
  298.             CopyBits( ¶ms->qdGlobalsCopy->qdThePort->portBits,
  299.                         (BitMap*)*( (*(*tHdl)->screenInfo[ j ])->tempWorld)->portPixMap,
  300.                         &fromRect,
  301.                         &toRect, 
  302.                         srcCopy, 
  303.                         (RgnHandle)NULL );
  304.             
  305.             SetGWorld( (GWorldPtr)( params->qdGlobalsCopy->qdThePort ), curDev );
  306.         
  307.             ScrollRect( &scrollRect, 1, 0, (RgnHandle)NULL );
  308.         
  309.             CopyBits( (BitMap*)*( (*(*tHdl)->screenInfo[ j ])->tempWorld)->portPixMap,
  310.                         ¶ms->qdGlobalsCopy->qdThePort->portBits,
  311.                         &toRect, 
  312.                         &toRect,
  313.                         srcCopy, 
  314.                         (RgnHandle)NULL );
  315.         }
  316.     }
  317.  
  318.     return noErr;
  319. }
  320.  
  321. OSErr DoSetUp(RgnHandle blankRgn,short message,GMParamBlockPtr params)
  322. {
  323.     return noErr;
  324. }
  325.  
  326. OSErr DoButton(RgnHandle blankRgn,short message,GMParamBlockPtr params)
  327. {
  328.     short            id;
  329.     StringHandle    urlHdl;
  330.     OSErr            err;
  331.  
  332.     switch ( message ){
  333.         case kGoToWebPageMsg:
  334.             id = kGoToWebPageStr;
  335.             break;
  336.         case kGetSourceCodeMsg:
  337.             id = kGetSourceCodeStr;
  338.             break;
  339.         default:
  340.             return noErr;
  341.             break;
  342.     }
  343.     
  344.     urlHdl = (StringHandle)GetResource( 'STR ', id );
  345.     if ( !urlHdl )
  346.         return resNotFound;
  347.     
  348.     HLock( (Handle)urlHdl );
  349.     err = GoToWebPage( (StringPtr)*urlHdl );
  350.     HUnlock( (Handle)urlHdl );
  351.     
  352.     ReleaseResource( (Handle)urlHdl );
  353.         
  354.     return err;
  355. }
  356.  
  357.